<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Facebook extends MY_Controller{
	private $CI;
	private $status = TRUE;
	private $app_id = '269349996510379'; //269349996510379 //512075685472594
	private $app_secret = '1c9a79f25eca11d20770d6d87355ed4f'; // 1c9a79f25eca11d20770d6d87355ed4f //c49714bb2f943ff53a2453099910bf25
	private $redirect_url = "";
	private $permissions = 'user_about_me,email';

	function Facebook(){
		parent::__construct();

    // Si se vinculara la cuenta facebook con un usuario ya existente concatena el parametro "u"
    // en el GET
    if (isset($_GET['u']))
    {
      $this->redirect_url = base_url('facebook/oauth/?u='.$_GET['u']);
    }
    else
    {
      $this->redirect_url = base_url('facebook/oauth');
    }

	}

	public function _remap($method){
		$this->{$method}();
	}

	public function oauth()
	{
		session_start();
		$code  = isset($_GET['code']) ? $_GET['code'] : '';
		$state = isset($_GET['state']) ? $_GET['state'] : '';

		if (empty($code))
		{
			$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
		 	$dialog_url = "http://www.facebook.com/dialog/oauth?"
	 								."client_id=". $this->app_id
	 								."&redirect_uri=". urlencode($this->redirect_url)
	 								."&state=". $_SESSION['state']."&scope=". $this->permissions;

			 echo("<script> top.location.href='" . $dialog_url . "'</script>");
	  }

	  if($_SESSION['state'] && ($_SESSION['state'] === $state))
	  {
  	 	$token_url = "https://graph.facebook.com/oauth/access_token?"
					       . "client_id=" . $this->app_id . "&redirect_uri=" . urlencode($this->redirect_url)
					       . "&client_secret=" . $this->app_secret . "&code=" . $code;

			$response = file_get_contents($token_url);
		  parse_str($response);

		  $graph_url = "https://graph.facebook.com/me?access_token=" . $access_token;
      $user = json_decode(file_get_contents($graph_url));

			$this->load->model('usuarios_model');
			if ( isset($user->id) ) {

        // Si el parametro GET "u" existe entonces se vinculara una cuenta facebook con el usuario logueado
        if (isset($_GET['u'])) {
          $this->usuarios_model->vincula_fb($_GET['u'], $user->id);
          redirect(base_url());
        }
        // 'email' => $user->email,
        $info_usr = $this->usuarios_model->exec_GetWhere('usuarios', array('facebook_user_id' => $user->id), TRUE);

				if ($info_usr)
				{
          if ($info_usr[0]->status == '1')
          {
            // Si el usuario ya existe se crea la SESSION  | , 'email' => $user->email
            $mdl_res = $this->usuarios_model->setLogin(array('facebook_user_id' => $user->id));

            if ($mdl_res[0] === FALSE) {
              redirect(base_url('home/?msg=3'));
            }
          }
          else
            redirect(base_url('home/?msg=1'));
				}
				else
				{
					if ($this->usuarios_model->exec_GetWhere('usuarios', array('email' => $user->email)))
					{
						// Actualiza el Id de facebook del usuario
						$this->usuarios_model->updateUserFields(array('facebook_user_id' => $user->id), array('email' => $user->email));
						// echo 'El usuario ya existe con ese email. Actualizo Id de facebook';
					}
					elseif ($this->usuarios_model->exec_GetWhere('usuarios', array('facebook_user_id' => $user->id)))
					{
						// Actualiza el email del usuario
						$this->usuarios_model->updateUserFields(array('email' => $user->email), array('facebook_user_id' => $user->id));
						// echo 'El usuario ya existe con ese ID de facebook. Se actualizo el Email';
					}
					else
					{
						$data    = array('facebook_user_id' => $user->id, 'nombre' => $user->name, 'email' => $user->email);
						$mdl_res = $this->usuarios_model->setRegistro(FALSE, $data);
						// echo 'Usuario registrado correctamente con Facebook';
					}
					$mdl_res = $this->usuarios_model->setLogin(array('facebook_user_id' => $user->id, 'email' => $user->email));
				}
				if ($mdl_res[0] != FALSE)
					redirect(base_url());
				redirect(base_url());
			}
		}
		else
		{
			echo $_GET['error_description'].'<br>';
			echo("The state does not match. You may be a victim of CSRF.");
		}
	}
}